package br.com.tmd.controlefinanceiro.modelo;

import java.io.Serializable;
import java.util.Calendar;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.OneToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.UniqueConstraint;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;

@Entity
public class Usuario implements Serializable {

    /**
     *
     */
    private static final long serialVersionUID = 1L;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "codigo")
    private Integer codigo;
    @Column(name = "login", length = 30)
    private String login;
    @Column(name = "senha", length = 255)
    private String senha;
    @Column(name = "data_cad_usuario")
    @Temporal(TemporalType.DATE)
    private Calendar dataCadastro;
    @Column(name = "ativo", length = 1)
    private Boolean ativo;
    @Column(name = "tipo", length = 1)
    private String tipo;

    @OneToOne(mappedBy = "usuario")
    @Cascade(value = CascadeType.SAVE_UPDATE)
    private Cliente cliente;

    //@Cascade(value = CascadeType.DELETE)
    @ElementCollection(targetClass = String.class, fetch = FetchType.EAGER)
    @JoinTable(
            name = "usuario_permissao",
            uniqueConstraints = {
                @UniqueConstraint(columnNames = {"usuario", "permissao"})},
            joinColumns
            = @JoinColumn(name = "usuario"))
    @Column(name = "permissao", length = 50)
    private Set<String> permissao = new HashSet<>();

    public Usuario() {
    }

    public Usuario(Integer codigo, String login, String senha, Calendar dataCadastro, Boolean ativo, String tipo) {
        this.codigo = codigo;
        this.login = login;
        this.senha = senha;
        this.dataCadastro = dataCadastro;
        this.ativo = ativo;
        this.tipo = tipo;
    }

    public Usuario(Integer codigo, String login, String senha, Calendar dataCadastro, Boolean ativo, String tipo, Cliente cliente) {
        this.codigo = codigo;
        this.login = login;
        this.senha = senha;
        this.dataCadastro = dataCadastro;
        this.ativo = ativo;
        this.tipo = tipo;
        this.cliente = cliente;
    }

    public Integer getCodigo() {
        return codigo;
    }

    public void setCodigo(Integer codigo) {
        this.codigo = codigo;
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public Calendar getDataCadastro() {
        return dataCadastro;
    }

    public void setDataCadastro(Calendar dataCadastro) {
        this.dataCadastro = dataCadastro;
    }

    public Boolean getAtivo() {
        return ativo;
    }

    public void setAtivo(Boolean ativo) {
        this.ativo = ativo;
    }

    public Boolean isAtivo() {
        return ativo;
    }

   

    public String getTipo() {
        return tipo;
    }

    public void setTipo(String tipo) {
        this.tipo = tipo;
    }

    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    public Set<String> getPermissao() {
        return permissao;
    }

    public void setPermissao(Set<String> permissao) {
        this.permissao = permissao;
    }

    @Override
    public int hashCode() {
        int hash = 3;
        hash = 29 * hash + Objects.hashCode(this.codigo);
        hash = 29 * hash + Objects.hashCode(this.login);
        hash = 29 * hash + Objects.hashCode(this.senha);
        hash = 29 * hash + Objects.hashCode(this.dataCadastro);
        hash = 29 * hash + Objects.hashCode(this.ativo);
        hash = 29 * hash + Objects.hashCode(this.tipo);
        hash = 29 * hash + Objects.hashCode(this.cliente);
        hash = 29 * hash + Objects.hashCode(this.permissao);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Usuario other = (Usuario) obj;
        if (!Objects.equals(this.codigo, other.codigo)) {
            return false;
        }
        if (!Objects.equals(this.login, other.login)) {
            return false;
        }
        if (!Objects.equals(this.senha, other.senha)) {
            return false;
        }
        if (!Objects.equals(this.dataCadastro, other.dataCadastro)) {
            return false;
        }
        if (!Objects.equals(this.ativo, other.ativo)) {
            return false;
        }
        if (!Objects.equals(this.tipo, other.tipo)) {
            return false;
        }
        if (!Objects.equals(this.cliente, other.cliente)) {
            return false;
        }
        return Objects.equals(this.permissao, other.permissao);
    }

    @Override
    public String toString() {
        return "Usuario{" + "codigo=" + codigo + ", login=" + login + ", senha=" + senha + ", dataCadastro=" + dataCadastro + ", ativo=" + ativo + ", tipo=" + tipo + ", cliente=" + cliente + ", permissao=" + permissao + '}';
    }

}
